import numpy as np
import matplotlib.pyplot as plt
# 从sklearn库的datasets模块导入make_blobs函数，这个函数可以帮助我们生成用于聚类的模拟数据。这就像是我们自己创造一些数据来测试我们的模型。
from sklearn.datasets import make_blobs
# 从sklearn库的cluster模块导入KMeans类，这是一个经典的聚类算法。它就像是一个聪明的分类器，能够自动将相似的数据点分到一组。
from sklearn.cluster import KMeans
# 从sklearn库的preprocessing模块导入StandardScaler类，这个类用于数据的标准化处理。这就像是我们把不同尺度的数据统一到一个标准尺度，让模型更容易学习。
from sklearn.preprocessing import StandardScaler
# 从sklearn库的metrics模块导入silhouette_score函数，这个函数用于计算轮廓系数，这个函数用于评估聚类效果。它就像是一个裁判，告诉我们聚类分得好不好。
from sklearn.metrics import silhouette_score

# 使用make_blobs函数生成了300个样本点，分为4个簇（centers=4）。
# cluster_std=2表示每个簇的标准差为2，这决定了簇的分散程度。
# random_state=42确保每次运行代码时生成的数据都是一样的。
X, y= make_blobs(n_samples=400,centers=4,cluster_std=2,random_state=42)

# 创建了一个StandardScaler对象，这个对象可以帮助我们将数据标准化。标准化就是将数据转换到均值为0，标准差为1的分布。
scaler = StandardScaler()

# 使用scaler对象对数据进行标准化处理。fit_transform方法会先计算数据的均值和标准差，然后将数据转换为标准正态分布
X_scaled = scaler.fit_transform(X)

# 创建了一个K-means聚类器，设置聚类数为4。random_state=42确保每次运行代码时得到相同的聚类结果。
kmeans = KMeans(n_clusters=4, random_state=42)

# 使用标准化后的数据训练K-means模型。这就像是让模型学习如何最好地将数据点分组。
kmeans.fit(X_scaled)

# 绘制原始数据
# 创建一个新的图形，设置大小为12x5英寸。
plt.figure(figsize=(12, 5))
# 将图形分成1行2列，当前绘制第1个子图。
plt.subplot(1, 2, 1)
# 绘制原始数据点，c=y表示根据真实标签设置不同的颜色，cmap='viridis'设置颜色映射。
plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=y, cmap='viridis')
# 设置子图的标题。
plt.title('original data')

# 绘制聚类结果
# 绘制第2个子图。
plt.subplot(1, 2, 2)
# 绘制聚类后的数据点，c=kmeans.labels_表示根据聚类标签设置不同的颜色。
plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=kmeans.labels_, cmap='viridis')
# 绘制聚类中心点，使用红色'x'标记，s=200设置点的大小，linewidths=3设置线条宽度。
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1],
            marker='x', s=200, linewidths=3, color='r', label='cluster centers')
# 设置子图的标题。
plt.title('K-means cluster result')
# 添加图例
plt.legend()
# 显示图形
plt.show()

# 计算轮廓系数
score = silhouette_score(X_scaled, kmeans.labels_)
print(f"轮廓系数: {score:.3f}")